unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs, StdCtrls;

type
  TMainForm = class(TForm)
    mOutput: TMemo;

    buttRun: TButton;
    buttThread: TButton;
    buttRunMixed: TButton;

    procedure buttRunClick(Sender: TObject);
    procedure buttThreadClick(Sender: TObject);
    procedure buttRunMixedClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TA = class(TObject)

  private
    { Private declarations }
  
   name:String;
 
  public
    procedure Execute;
    procedure SetName(name:string);
  end;

  TB = class(TThread)

  private
    { Private declarations }

     name:String;

  protected
    procedure Execute; override;
  public
    procedure SetName(name:string);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

{ TA }

procedure TA.SetName(name: string);
begin
   Self.Name:=name;
end;

procedure TA.Execute;
var i:integer;
begin
  for i:=1 to 1000 do begin
        MainForm.mOutput.Lines.Add(name+'   '+intToStr(i));
        Application.ProcessMessages;
  end;
end;

{ TB }

procedure TB.SetName(name: string);
begin
   Self.Name:=name;
end;

procedure TB.Execute;
var i:integer;
begin
  FreeOnTerminate:=True;
  for i:=1 to 1000 do
        MainForm.mOutput.Lines.Add(name+'   '+intToStr(i));
end;


{MainForm}

procedure TMainForm.buttRunClick(Sender: TObject);
var 
       A1,A2:TA;
begin
  mOutput.Lines.Clear;

  A1:=TA.Create;
  A2:=TA.Create;

  A1.SetName('A1 Object ');
  A2.SetName('A2 Object ');

  A1.Execute;
  A2.Execute;

  A1.Free;
  A2.Free;
end;


procedure TMainForm.buttThreadClick(Sender: TObject);
var  
      B1,B2:TB;
begin
  mOutput.Lines.Clear;

  B1:=TB.Create(True);
  B2:=TB.Create(True);

  B1.SetName('B1 Thread ');
  B2.SetName('B2 Thread ');

  B1.Resume;
  B2.Resume;
  ShowMessage('Thread started');
end;

procedure TMainForm.buttRunMixedClick(Sender: 
                                                                                TObject);
var
   A:TA;
   B:TB;

begin
  mOutput.Lines.Clear;

  A:=TA.Create;
  B:=TB.Create(true);

  A.SetName('A Object ');
  B.SetName('B  Thread ');

  B.Resume;
  A.Execute;

  A.Free;
ShowMessage('Finished');
end;

end.
